• Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Search
  • Register
  • Login
Netgate Discussion Forum
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Search
  • Register
  • Login

Cannot get cronjob to work - scripts work when entred manually into shell

Scheduled Pinned Locked Moved pfSense Packages
15 Posts 3 Posters 5.4k Views
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • B
    bigbudd911
    last edited by May 27, 2013, 1:18 PM

    Hi all. I had made a previous topic earlier on the forum, explaining what I am doing:
    http://forum.pfsense.org/index.php/topic,62598.0.html

    So I resolved my first issue. The command was working perfectly fine, however my installation of Pfsense was corrupted and I was unaware of this. Reinstalling Pfsense fixed everything - curl commands work great now.

    So basically, I have 3 scripts which are one line each, which I am trying to get working on a schedule in cron. I am only 14, and am not really sure where to get help with this. The commands that I enter into shell, do exactly as they are supposed to. The first two scripts simply pull my IP addresses while I am connected to my VPN. The third command, is to request the correct port that my VPN provider allows me to use (which changes randomly on their end)

    Contents of the scripts

    script1:
    #!/bin/sh
    ifconfig OPT1  | grep "inet " | cut -d\  -f2|tee /tmp/vpn_ip

    script2:
    #!/bin/sh
    curl ifconfig.me/ip|tee /tmp/vpn_external_ip

    script3:
    curl -o /etc/portforwardlist -d "user=USERNAME&pass=PASSWORD&client_id=$(cat ~/.pia_client_id)&local_ip=$(cat /tmp/vpn_ip)" https://www.privateinternetaccess.com/vpninfo/port_forward_assignment

    I have all of these scripts in /etc/
    In "cron" I have configured the first script to run every minute, the second to run every 2 minutes, and the 3rd to run every 3 minutes. In script 3, i added the -o argument to output to a file. This does work when entered manally into shell as well.

    Cron Setup:

    1 * * * * root /usr/bin/nice -n20 /etc/script1

    2 * * * * root /usr/bin/nice -n20 /etc/script2

    3 * * * * root /usr/bin/nice -n20 /etc/script3

    I then reboot my system for good measure, however, none of the files get outputed. The commands work when entered manually into shell. I am so unsure where to go from here, and I hate asking, becuase I know BSD is for pro's. But I am so new to BSD at my age, and I love the features of Pfsense. I appologies if I sound very noobish, but just can't seem to get this to work.

    Thanks for any assistance :)

    1 Reply Last reply Reply Quote 0
    • M
      marcelloc
      last edited by May 27, 2013, 1:42 PM

      use full path binaries on your script that is running via cron.

      Treinamentos de Elite: http://sys-squad.com

      Help a community developer! ;D

      1 Reply Last reply Reply Quote 0
      • P
        phil.davis
        last edited by May 27, 2013, 1:44 PM

        Use the full path to each executable - e.g.

        /sbin/ifconfig
        /usr/bin/grep
        

        and so on.

        You can find where the utilities live with the find command, e.g.:

        find / -name ifconfig
        /sbin/ifconfig
        

        As the Greek philosopher Isosceles used to say, "There are 3 sides to every triangle."
        If I helped you, then help someone else - buy someone a gift from the INF catalog http://secure.inf.org/gifts/usd/

        1 Reply Last reply Reply Quote 0
        • B
          bigbudd911
          last edited by May 27, 2013, 2:19 PM

          Okay thanks for the quick reply guys!

          When you say the full path, are you refering to INSIDE the script? ex.

          #!/bin/sh
          /sbin/ifconfig OPT1  | grep "inet " | cut -d\  -f2|tee /tmp/vpn_ip

          instead of:

          #!/bin/sh
          ifconfig OPT1  | grep "inet " | cut -d\  -f2|tee /tmp/vpn_ip

          Thanks :D

          1 Reply Last reply Reply Quote 0
          • M
            marcelloc
            last edited by May 27, 2013, 2:23 PM

            @bigbudd911:

            When you say the full path, are you refering to INSIDE the script? ex.

            Yes.  :)

            Treinamentos de Elite: http://sys-squad.com

            Help a community developer! ;D

            1 Reply Last reply Reply Quote 0
            • B
              bigbudd911
              last edited by May 27, 2013, 2:27 PM

              Awesome. Thank you guys so much!

              1 Reply Last reply Reply Quote 0
              • B
                bigbudd911
                last edited by May 27, 2013, 11:19 PM

                Okay so I just got rid of the last two, to make testing easier.

                I have used the following as my script1.sh  :

                #!/bin/sh
                /sbin/ifconfig ovpnc1  | /usr/bin/grep "inet " | /usr/bin/cut -d\  -f2|/usr/bin/tee /tmp/vpn_ip

                i have tried also putting in a space after the | in between /usr/bin/tee - with no avail. Any idea gents?

                Thank you very much!

                1 Reply Last reply Reply Quote 0
                • P
                  phil.davis
                  last edited by May 28, 2013, 2:19 AM

                  This works for me in cron:

                  #!/bin/sh
                  /sbin/ifconfig ovpnc1 | /usr/bin/grep "inet" | /usr/bin/cut -f2 -d " " > /tmp/zzz.txt
                  

                  I guess the "tee" utility does not work so well in a background job? Or maybe the "-d" did something odd?

                  As the Greek philosopher Isosceles used to say, "There are 3 sides to every triangle."
                  If I helped you, then help someone else - buy someone a gift from the INF catalog http://secure.inf.org/gifts/usd/

                  1 Reply Last reply Reply Quote 0
                  • B
                    bigbudd911
                    last edited by May 28, 2013, 1:12 PM

                    Thanks very much Phil. I was starting to think that
                    maybe it was having difficulty with one of the commands.
                    I will give that a shot tonight when I get home from school.
                    And just verifying, the command you enter in CRON is just
                    to start the script, correct?

                    ex.
                    1  *  *  *  *  root  /usr/bin/nice -n20 /etc/script1

                    OR do you put the actual shell command into the CRON entry?
                    (I dont think you do?). Sorry for all the newbish questions guys.

                    Once I get this working, I am going to make a tutorial for getting
                    this setup entirely, as we have a lot of inexperienced users over
                    at my VPN providers boards trying to accomplish the same thing
                    I am. Thanks for all the help guys, you are too kind!

                    1 Reply Last reply Reply Quote 0
                    • B
                      bigbudd911
                      last edited by May 28, 2013, 1:30 PM

                      think i may have found the error. on the tee line, i believe i need a " . "

                      /usr/bin/tee ./tmp/vpn_ip

                      1 Reply Last reply Reply Quote 0
                      • M
                        marcelloc
                        last edited by May 28, 2013, 2:39 PM

                        @bigbudd911:

                        /usr/bin/tee ./tmp/vpn_ip

                        why you need tee as it is running via cron?

                        did you tried to just redirect to your log file?

                        Treinamentos de Elite: http://sys-squad.com

                        Help a community developer! ;D

                        1 Reply Last reply Reply Quote 0
                        • B
                          bigbudd911
                          last edited by May 29, 2013, 12:11 AM May 28, 2013, 11:55 PM

                          So I tried editing the script to how you said:

                          #!/bin/sh
                          /sbin/ifconfig ovpnc1 | /usr/bin/grep "inet" | /usr/bin/cut -f2 -d " " > /tmp/zzz.txt

                          this is a script - directory is     /etc/script1.sh

                          the crontab entry looks as follows:

                          1   *   *   *   *   root   /usr/bin/nice -n2 /etc/script1.sh

                          and still a no go. this is driving me crazy haha. I am on pfsense 2.1 beta if that
                          makes a huge difference?

                          also, when i run the command in basic shell that Marcelloc posted, I end up getting two lines,
                          an ipv6 address and the ipv4 on line 2

                          1 Reply Last reply Reply Quote 0
                          • P
                            phil.davis
                            last edited by May 29, 2013, 5:09 AM

                            I created /etc/script1.sh containing:

                            #!/bin/sh
                            /sbin/ifconfig ovpnc1 | /usr/bin/grep "inet" | /usr/bin/cut -f2 -d " " > /tmp/zzz.txt
                            

                            Then allow execute and everything on it (you can be more restrictive - this is for testing!):

                            chmod 777 /etc/script1.sh
                            

                            Then add to cron:

                            */1  	*  	*  	*  	*  	root  	/usr/bin/nice -n20 /etc/script1.sh
                            

                            "*/1" runs it every minute. Your setting of "1" in minutes will run it only at 1 minute past each hour.

                            On 2.1 there is IPv6. The OpenVPN gets an IPv6 "fe80:" address as well as IPv4. The output of /sbin/ifconfig contains lines for "inet" and "inet6", which both match your grep. The easy fix is to do

                            /usr/bin/grep -w "inet"
                            

                            then it will match the word "inet" and not the word "inet6".

                            As the Greek philosopher Isosceles used to say, "There are 3 sides to every triangle."
                            If I helped you, then help someone else - buy someone a gift from the INF catalog http://secure.inf.org/gifts/usd/

                            1 Reply Last reply Reply Quote 0
                            • B
                              bigbudd911
                              last edited by May 29, 2013, 1:33 PM

                              Thank you so much Phil for being patient with me.
                              I know it sucks answering super noobish stuff. I really do
                              appreciate it. I was totally unaware of the */1 as well,
                              so that is a big help. :D Will try again tonight, or maybe if
                              I can find an old PC in my computer class, I will give it a try
                              shortly.

                              1 Reply Last reply Reply Quote 0
                              • B
                                bigbudd911
                                last edited by May 30, 2013, 3:28 AM May 30, 2013, 1:07 AM

                                Alright!! Phil you were correct. That worked for the first script. The second one I managed to get working (somehow with the tee command). I ended up using:

                                #!/bin/sh
                                /usr/local/bin/curl ifconfig.me/ip|tee /tmp/vpn_external

                                Now I am on to the final command, I have tinkered with it for about 2 hours, and I can get it to output a file, but the file only contains  {}  , usually it would have the port inside the brackets, ex. {45000}. Currently I am using the following command (the X's represent my username and password. If I enter the command into shell, it does work) I tried using the full path to both cat commands (and without) but no go:

                                #!/bin/sh
                                /usr/local/bin/curl -o /tmp/portforwardlist -d "user=XXXXX&pass=XXXXX&client_id=$(/bin/cat ~/.pia_config)&local_ip=$(/bin/cat /tmp/vpn_ip)" https://www.privateinternetaccess.com/vpninfo/port_forward_assignment

                                ALMOST THERE

                                1 Reply Last reply Reply Quote 0
                                15 out of 15
                                • First post
                                  15/15
                                  Last post
                                Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.
                                  This community forum collects and processes your personal information.
                                  consent.not_received